--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
android/app/src/main/java/com/meshchatx/rnode/RNodeFlasherActivity.java e0f1f99cd1c208c5008a936230c38e448dddd45d (e0f1f99c) Text, 17.27 KB
Tff7b72package T7ee787com.meshchatx.rnodeTb4b4b4;
Tff7b72import T7ee787android.ManifestTb4b4b4;
Tff7b72import T7ee787android.content.IntentTb4b4b4;
Tff7b72import T7ee787android.content.pm.PackageManagerTb4b4b4;
Tff7b72import T7ee787android.net.UriTb4b4b4;
Tff7b72import T7ee787android.os.BuildTb4b4b4;
Tff7b72import T7ee787android.os.BundleTb4b4b4;
Tff7b72import T7ee787android.os.HandlerTb4b4b4;
Tff7b72import T7ee787android.os.LooperTb4b4b4;
Tff7b72import T7ee787android.provider.SettingsTb4b4b4;
Tff7b72import T7ee787android.view.ViewTb4b4b4;
Tff7b72import T7ee787android.webkit.CookieManagerTb4b4b4;
Tff7b72import T7ee787android.widget.AdapterViewTb4b4b4;
Tff7b72import T7ee787android.widget.ArrayAdapterTb4b4b4;
Tff7b72import T7ee787android.widget.ButtonTb4b4b4;
Tff7b72import T7ee787android.widget.ProgressBarTb4b4b4;
Tff7b72import T7ee787android.widget.SpinnerTb4b4b4;
Tff7b72import T7ee787android.widget.TextViewTb4b4b4;
Tff7b72import T7ee787android.widget.ToastTb4b4b4;
Tff7b72import T7ee787androidx.annotation.NullableTb4b4b4;
Tff7b72import T7ee787androidx.appcompat.app.AppCompatActivityTb4b4b4;
Tff7b72import T7ee787androidx.core.app.ActivityCompatTb4b4b4;
Tff7b72import T7ee787androidx.core.content.ContextCompatTb4b4b4;
Tff7b72import T7ee787com.meshchatx.LocalhostTrustOkHttpClientTb4b4b4;
Tff7b72import T7ee787com.meshchatx.RTb4b4b4;
Tff7b72import T7ee787org.json.JSONArrayTb4b4b4;
Tff7b72import T7ee787org.json.JSONObjectTb4b4b4;
Tff7b72import T7ee787java.io.FileTb4b4b4;
Tff7b72import T7ee787java.io.FileOutputStreamTb4b4b4;
Tff7b72import T7ee787java.util.ArrayListTb4b4b4;
Tff7b72import T7ee787java.util.ListTb4b4b4;
Tff7b72import T7ee787java.util.MapTb4b4b4;
Tff7b72import T7ee787java.util.concurrent.ExecutorServiceTb4b4b4;
Tff7b72import T7ee787java.util.concurrent.ExecutorsTb4b4b4;
Tff7b72import T7ee787okhttp3.OkHttpClientTb4b4b4;
Tff7b72import T7ee787okhttp3.RequestTb4b4b4;
Tff7b72import T7ee787okhttp3.ResponseTb4b4b4;
Tff7b72import T7ee787okhttp3.ResponseBodyTb4b4b4;
T8b949e/**
* Fully native RNode flasher (USB serial + ESP32 ROM protocol).
* Launched from the WebView Tools page via MeshChatXAndroid.openRNodeFlasher().
*/
Tff7b72public Tff7b72final Tff7b72class T56d364RNodeFlasherActivity Tff7b72extends Te6edf3AppCompatActivity Tff7b72implements Te6edf3UsbSerialHubTb4b4b4.Te6edf3Listener Tb4b4b4{
Tff7b72private Tff7b72static Tff7b72final Tffa657int Te6edf3REQ_BT Tff7b72= T79c0ff4401Tb4b4b4;
Tff7b72private Tff7b72static Tff7b72final Te6edf3String Te6edf3LOCAL_API Tff7b72= Ta5d6ff"Ta5d6ffhttps://127.0.0.1:8000Ta5d6ff"Tb4b4b4;
Tff7b72private Tff7b72final Te6edf3Handler Te6edf3mainHandler Tff7b72= Tff7b72new Te6edf3HandlerTb4b4b4(Te6edf3LooperTb4b4b4.Te6edf3getMainLooperTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72private Tff7b72final Te6edf3ExecutorService Te6edf3io Tff7b72= Te6edf3ExecutorsTb4b4b4.Te6edf3newSingleThreadExecutorTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72private Te6edf3UsbSerialHub Te6edf3usbHubTb4b4b4;
Tff7b72private Te6edf3ProductCatalog Te6edf3catalogTb4b4b4;
Tf0883e@Nullable
Tff7b72private Tffa657byteTff7b72[Tff7b72] Te6edf3firmwareBytesTb4b4b4;
Tf0883e@Nullable
Tff7b72private Te6edf3String Te6edf3firmwareNameTb4b4b4;
Tff7b72private Te6edf3Spinner Te6edf3usbSpinnerTb4b4b4;
Tff7b72private Te6edf3Spinner Te6edf3productSpinnerTb4b4b4;
Tff7b72private Te6edf3Spinner Te6edf3modelSpinnerTb4b4b4;
Tff7b72private Te6edf3ProgressBar Te6edf3progressBarTb4b4b4;
Tff7b72private Te6edf3TextView Te6edf3statusViewTb4b4b4;
Tff7b72private Te6edf3TextView Te6edf3logViewTb4b4b4;
Tff7b72private Te6edf3Button Te6edf3flashButtonTb4b4b4;
Tff7b72private Te6edf3Button Te6edf3downloadButtonTb4b4b4;
Tff7b72private Tff7b72final Te6edf3ListTff7b72<Te6edf3UsbSerialHubTb4b4b4.Te6edf3PortInfoTff7b72> Te6edf3ports Tff7b72= Tff7b72new Te6edf3ArrayListTff7b72<Tff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72private Te6edf3ArrayAdapterTff7b72<Te6edf3UsbSerialHubTb4b4b4.Te6edf3PortInfoTff7b72> Te6edf3usbAdapterTb4b4b4;
Tff7b72private Te6edf3ArrayAdapterTff7b72<Te6edf3ProductCatalogTb4b4b4.Te6edf3ProductTff7b72> Te6edf3productAdapterTb4b4b4;
Tff7b72private Te6edf3ArrayAdapterTff7b72<Te6edf3ProductCatalogTb4b4b4.Te6edf3ModelTff7b72> Te6edf3modelAdapterTb4b4b4;
Tf0883e@Override
Tff7b72protected Tffa657void Td2a8ffonCreateTb4b4b4(Tf0883e@Nullable Te6edf3Bundle Te6edf3savedInstanceStateTb4b4b4) Tb4b4b4{
Tff7b72superTb4b4b4.Te6edf3onCreateTb4b4b4(Te6edf3savedInstanceStateTb4b4b4)Tb4b4b4;
Te6edf3setContentViewTb4b4b4(Te6edf3RTb4b4b4.Te6edf3layoutTb4b4b4.Te6edf3activity_rnode_flasherTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3getSupportActionBarTb4b4b4(Tb4b4b4) Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3getSupportActionBarTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3setTitleTb4b4b4(Te6edf3RTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3rnode_flasher_titleTb4b4b4)Tb4b4b4;
Te6edf3getSupportActionBarTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3setDisplayHomeAsUpEnabledTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3usbSpinner Tff7b72= Te6edf3findViewByIdTb4b4b4(Te6edf3RTb4b4b4.Te6edf3idTb4b4b4.Te6edf3rnodeUsbSpinnerTb4b4b4)Tb4b4b4;
Te6edf3productSpinner Tff7b72= Te6edf3findViewByIdTb4b4b4(Te6edf3RTb4b4b4.Te6edf3idTb4b4b4.Te6edf3rnodeProductSpinnerTb4b4b4)Tb4b4b4;
Te6edf3modelSpinner Tff7b72= Te6edf3findViewByIdTb4b4b4(Te6edf3RTb4b4b4.Te6edf3idTb4b4b4.Te6edf3rnodeModelSpinnerTb4b4b4)Tb4b4b4;
Te6edf3progressBar Tff7b72= Te6edf3findViewByIdTb4b4b4(Te6edf3RTb4b4b4.Te6edf3idTb4b4b4.Te6edf3rnodeProgressTb4b4b4)Tb4b4b4;
Te6edf3statusView Tff7b72= Te6edf3findViewByIdTb4b4b4(Te6edf3RTb4b4b4.Te6edf3idTb4b4b4.Te6edf3rnodeStatusTb4b4b4)Tb4b4b4;
Te6edf3logView Tff7b72= Te6edf3findViewByIdTb4b4b4(Te6edf3RTb4b4b4.Te6edf3idTb4b4b4.Te6edf3rnodeLogTb4b4b4)Tb4b4b4;
Te6edf3flashButton Tff7b72= Te6edf3findViewByIdTb4b4b4(Te6edf3RTb4b4b4.Te6edf3idTb4b4b4.Te6edf3rnodeFlashTb4b4b4)Tb4b4b4;
Te6edf3downloadButton Tff7b72= Te6edf3findViewByIdTb4b4b4(Te6edf3RTb4b4b4.Te6edf3idTb4b4b4.Te6edf3rnodeDownloadFirmwareTb4b4b4)Tb4b4b4;
Te6edf3usbAdapter Tff7b72= Tff7b72new Te6edf3ArrayAdapterTff7b72<Tff7b72>Tb4b4b4(Tff7b72thisTb4b4b4, Te6edf3androidTb4b4b4.Te6edf3RTb4b4b4.Te6edf3layoutTb4b4b4.Te6edf3simple_spinner_dropdown_itemTb4b4b4, Te6edf3portsTb4b4b4)Tb4b4b4;
Te6edf3usbSpinnerTb4b4b4.Te6edf3setAdapterTb4b4b4(Te6edf3usbAdapterTb4b4b4)Tb4b4b4;
Tff7b72try Tb4b4b4{
Te6edf3catalog Tff7b72= Te6edf3ProductCatalogTb4b4b4.Te6edf3loadTb4b4b4(Tff7b72thisTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3Exception Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3appendLogTb4b4b4(Ta5d6ff"Ta5d6ffFailed to load product catalog: Ta5d6ff" Tff7b72+ Te6edf3eTb4b4b4.Te6edf3getMessageTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3catalog Tff7b72= Te6edf3ProductCatalogTb4b4b4.Te6edf3emptyTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3productAdapter Tff7b72=
Tff7b72new Te6edf3ArrayAdapterTff7b72<Tff7b72>Tb4b4b4(Tff7b72thisTb4b4b4, Te6edf3androidTb4b4b4.Te6edf3RTb4b4b4.Te6edf3layoutTb4b4b4.Te6edf3simple_spinner_dropdown_itemTb4b4b4, Te6edf3catalogTb4b4b4.Te6edf3productsTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3productSpinnerTb4b4b4.Te6edf3setAdapterTb4b4b4(Te6edf3productAdapterTb4b4b4)Tb4b4b4;
Te6edf3modelAdapter Tff7b72=
Tff7b72new Te6edf3ArrayAdapterTff7b72<Tff7b72>Tb4b4b4(Tff7b72thisTb4b4b4, Te6edf3androidTb4b4b4.Te6edf3RTb4b4b4.Te6edf3layoutTb4b4b4.Te6edf3simple_spinner_dropdown_itemTb4b4b4, Tff7b72new Te6edf3ArrayListTff7b72<Tff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3modelSpinnerTb4b4b4.Te6edf3setAdapterTb4b4b4(Te6edf3modelAdapterTb4b4b4)Tb4b4b4;
Te6edf3productSpinnerTb4b4b4.Te6edf3setOnItemSelectedListenerTb4b4b4(
Tff7b72new Te6edf3AdapterViewTb4b4b4.Te6edf3OnItemSelectedListenerTb4b4b4(Tb4b4b4) Tb4b4b4{
Tf0883e@Override
Tff7b72public Tffa657void Td2a8ffonItemSelectedTb4b4b4(Te6edf3AdapterViewTff7b72<Tff7b72?Tff7b72> Te6edf3parentTb4b4b4, Te6edf3View Te6edf3viewTb4b4b4, Tffa657int Te6edf3positionTb4b4b4, Tffa657long Te6edf3idTb4b4b4) Tb4b4b4{
Te6edf3refreshModelsTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tf0883e@Override
Tff7b72public Tffa657void Td2a8ffonNothingSelectedTb4b4b4(Te6edf3AdapterViewTff7b72<Tff7b72?Tff7b72> Te6edf3parentTb4b4b4) Tb4b4b4{
Tb4b4b4}
Tb4b4b4}
Tb4b4b4)Tb4b4b4;
Te6edf3findViewByIdTb4b4b4(Te6edf3RTb4b4b4.Te6edf3idTb4b4b4.Te6edf3rnodeRefreshUsbTb4b4b4)Tb4b4b4.Te6edf3setOnClickListenerTb4b4b4(Te6edf3v Tff7b72-Tff7b72> Te6edf3refreshPortsTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3findViewByIdTb4b4b4(Te6edf3RTb4b4b4.Te6edf3idTb4b4b4.Te6edf3rnodeRequestUsbTb4b4b4)Tb4b4b4.Te6edf3setOnClickListenerTb4b4b4(Te6edf3v Tff7b72-Tff7b72> Te6edf3requestUsbPermissionTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3findViewByIdTb4b4b4(Te6edf3RTb4b4b4.Te6edf3idTb4b4b4.Te6edf3rnodeRequestBluetoothTb4b4b4)Tb4b4b4.Te6edf3setOnClickListenerTb4b4b4(Te6edf3v Tff7b72-Tff7b72> Te6edf3requestBluetoothTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3findViewByIdTb4b4b4(Te6edf3RTb4b4b4.Te6edf3idTb4b4b4.Te6edf3rnodeOpenAppSettingsTb4b4b4)Tb4b4b4.Te6edf3setOnClickListenerTb4b4b4(Te6edf3v Tff7b72-Tff7b72> Te6edf3openAppSettingsTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3downloadButtonTb4b4b4.Te6edf3setOnClickListenerTb4b4b4(Te6edf3v Tff7b72-Tff7b72> Te6edf3downloadFirmwareTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3flashButtonTb4b4b4.Te6edf3setOnClickListenerTb4b4b4(Te6edf3v Tff7b72-Tff7b72> Te6edf3flashSelectedTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3usbHub Tff7b72= Tff7b72new Te6edf3UsbSerialHubTb4b4b4(Tff7b72thisTb4b4b4)Tb4b4b4;
Te6edf3usbHubTb4b4b4.Te6edf3addListenerTb4b4b4(Tff7b72thisTb4b4b4)Tb4b4b4;
Te6edf3usbHubTb4b4b4.Te6edf3startTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3refreshPortsTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3refreshModelsTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3appendLogTb4b4b4(Ta5d6ff"Ta5d6ffNative RNode flasher ready.Ta5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tf0883e@Override
Tff7b72public Tffa657boolean Td2a8ffonSupportNavigateUpTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3finishTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}
Tf0883e@Override
Tff7b72protected Tffa657void Td2a8ffonDestroyTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3usbHub Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3usbHubTb4b4b4.Te6edf3stopTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3usbHub Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4}
Te6edf3ioTb4b4b4.Te6edf3shutdownNowTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72superTb4b4b4.Te6edf3onDestroyTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tf0883e@Override
Tff7b72public Tffa657void Td2a8ffonUsbPermissionResultTb4b4b4(Te6edf3String Te6edf3deviceIdTb4b4b4, Tffa657boolean Te6edf3grantedTb4b4b4) Tb4b4b4{
Te6edf3appendLogTb4b4b4(Ta5d6ff"Ta5d6ffUSB permission Ta5d6ff" Tff7b72+ Tb4b4b4(Te6edf3granted Tff7b72? Ta5d6ff"Ta5d6ffgrantedTa5d6ff" Tb4b4b4: Ta5d6ff"Ta5d6ffdeniedTa5d6ff"Tb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff for Ta5d6ff" Tff7b72+ Te6edf3deviceIdTb4b4b4)Tb4b4b4;
Te6edf3refreshPortsTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tf0883e@Override
Tff7b72public Tffa657void Td2a8ffonPortsChangedTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3refreshPortsTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tf0883e@Override
Tff7b72public Tffa657void Td2a8ffonRequestPermissionsResultTb4b4b4(Tffa657int Te6edf3requestCodeTb4b4b4, Te6edf3StringTff7b72[Tff7b72] Te6edf3permissionsTb4b4b4, Tffa657intTff7b72[Tff7b72] Te6edf3grantResultsTb4b4b4) Tb4b4b4{
Tff7b72superTb4b4b4.Te6edf3onRequestPermissionsResultTb4b4b4(Te6edf3requestCodeTb4b4b4, Te6edf3permissionsTb4b4b4, Te6edf3grantResultsTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3requestCode Tff7b72!Tff7b72= Te6edf3REQ_BTTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tffa657boolean Te6edf3ok Tff7b72= Tff7b72trueTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3grantResults Tff7b72=Tff7b72= Tff7b72null Tff7b72|Tff7b72| Te6edf3grantResultsTb4b4b4.Te6edf3length Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3ok Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72for Tb4b4b4(Tffa657int Te6edf3result Tb4b4b4: Te6edf3grantResultsTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3result Tff7b72!Tff7b72= Te6edf3PackageManagerTb4b4b4.Te6edf3PERMISSION_GRANTEDTb4b4b4) Tb4b4b4{
Te6edf3ok Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Te6edf3appendLogTb4b4b4(Te6edf3ok Tff7b72? Ta5d6ff"Ta5d6ffBluetooth permission granted.Ta5d6ff" Tb4b4b4: Ta5d6ff"Ta5d6ffBluetooth permission denied.Ta5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3ToastTb4b4b4.Te6edf3makeTextTb4b4b4(
Tff7b72thisTb4b4b4,
Te6edf3ok Tff7b72? Ta5d6ff"Ta5d6ffBluetooth allowedTa5d6ff" Tb4b4b4: Ta5d6ff"Ta5d6ffBluetooth deniedTa5d6ff"Tb4b4b4,
Te6edf3ToastTb4b4b4.Te6edf3LENGTH_SHORT
Tb4b4b4)Tb4b4b4.Te6edf3showTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72private Tffa657void Td2a8ffrefreshPortsTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3portsTb4b4b4.Te6edf3clearTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3usbHub Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3portsTb4b4b4.Te6edf3addAllTb4b4b4(Te6edf3usbHubTb4b4b4.Te6edf3listPortsTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3usbAdapterTb4b4b4.Te6edf3notifyDataSetChangedTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3portsTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3setStatusTb4b4b4(Te6edf3getStringTb4b4b4(Te6edf3RTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3rnode_flasher_no_usbTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3setStatusTb4b4b4(Te6edf3portsTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff USB serial device(s)Ta5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72private Tffa657void Td2a8ffrefreshModelsTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3modelAdapterTb4b4b4.Te6edf3clearTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3ProductCatalogTb4b4b4.Te6edf3Product Te6edf3product Tff7b72= Te6edf3selectedProductTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3product Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3modelAdapterTb4b4b4.Te6edf3addAllTb4b4b4(Te6edf3productTb4b4b4.Te6edf3modelsTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3modelAdapterTb4b4b4.Te6edf3notifyDataSetChangedTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72private Tffa657void Td2a8ffrequestUsbPermissionTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3UsbSerialHubTb4b4b4.Te6edf3PortInfo Te6edf3port Tff7b72= Te6edf3selectedPortTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3port Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tffa657boolean Te6edf3any Tff7b72= Te6edf3usbHub Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Te6edf3usbHubTb4b4b4.Te6edf3requestPermissionsForAllTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3appendLogTb4b4b4(Te6edf3any Tff7b72? Ta5d6ff"Ta5d6ffRequested USB permissions.Ta5d6ff" Tb4b4b4: Ta5d6ff"Ta5d6ffNo USB devices need permission.Ta5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3portTb4b4b4.Te6edf3hasPermissionTb4b4b4) Tb4b4b4{
Te6edf3appendLogTb4b4b4(Ta5d6ff"Ta5d6ffUSB already allowed for Ta5d6ff" Tff7b72+ Te6edf3portTb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3usbHub Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3usbHubTb4b4b4.Te6edf3requestPermissionTb4b4b4(Te6edf3portTb4b4b4.Te6edf3deviceIdTb4b4b4)Tb4b4b4;
Te6edf3appendLogTb4b4b4(Ta5d6ff"Ta5d6ffRequested USB permission for Ta5d6ff" Tff7b72+ Te6edf3portTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72private Tffa657void Td2a8ffrequestBluetoothTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3BuildTb4b4b4.Te6edf3VERSIONTb4b4b4.Te6edf3SDK_INT Tff7b72< Te6edf3BuildTb4b4b4.Te6edf3VERSION_CODESTb4b4b4.Te6edf3STb4b4b4) Tb4b4b4{
Te6edf3appendLogTb4b4b4(Ta5d6ff"Ta5d6ffBluetooth runtime permission not required on this Android version.Ta5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Te6edf3ListTff7b72<Te6edf3StringTff7b72> Te6edf3missing Tff7b72= Tff7b72new Te6edf3ArrayListTff7b72<Tff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3ContextCompatTb4b4b4.Te6edf3checkSelfPermissionTb4b4b4(Tff7b72thisTb4b4b4, Te6edf3ManifestTb4b4b4.Te6edf3permissionTb4b4b4.Te6edf3BLUETOOTH_CONNECTTb4b4b4)
Tff7b72!Tff7b72= Te6edf3PackageManagerTb4b4b4.Te6edf3PERMISSION_GRANTEDTb4b4b4) Tb4b4b4{
Te6edf3missingTb4b4b4.Te6edf3addTb4b4b4(Te6edf3ManifestTb4b4b4.Te6edf3permissionTb4b4b4.Te6edf3BLUETOOTH_CONNECTTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3ContextCompatTb4b4b4.Te6edf3checkSelfPermissionTb4b4b4(Tff7b72thisTb4b4b4, Te6edf3ManifestTb4b4b4.Te6edf3permissionTb4b4b4.Te6edf3BLUETOOTH_SCANTb4b4b4)
Tff7b72!Tff7b72= Te6edf3PackageManagerTb4b4b4.Te6edf3PERMISSION_GRANTEDTb4b4b4) Tb4b4b4{
Te6edf3missingTb4b4b4.Te6edf3addTb4b4b4(Te6edf3ManifestTb4b4b4.Te6edf3permissionTb4b4b4.Te6edf3BLUETOOTH_SCANTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3missingTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3appendLogTb4b4b4(Ta5d6ff"Ta5d6ffBluetooth permission already granted.Ta5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3ToastTb4b4b4.Te6edf3makeTextTb4b4b4(Tff7b72thisTb4b4b4, Ta5d6ff"Ta5d6ffBluetooth already allowedTa5d6ff"Tb4b4b4, Te6edf3ToastTb4b4b4.Te6edf3LENGTH_SHORTTb4b4b4)Tb4b4b4.Te6edf3showTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Te6edf3ActivityCompatTb4b4b4.Te6edf3requestPermissionsTb4b4b4(Tff7b72thisTb4b4b4, Te6edf3missingTb4b4b4.Te6edf3toArrayTb4b4b4(Tff7b72new Te6edf3StringTff7b72[T79c0ff0Tff7b72]Tb4b4b4)Tb4b4b4, Te6edf3REQ_BTTb4b4b4)Tb4b4b4;
Te6edf3appendLogTb4b4b4(Ta5d6ff"Ta5d6ffRequesting Bluetooth permissions…Ta5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72private Tffa657void Td2a8ffopenAppSettingsTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3startActivityTb4b4b4(
Tff7b72new Te6edf3IntentTb4b4b4(
Te6edf3SettingsTb4b4b4.Te6edf3ACTION_APPLICATION_DETAILS_SETTINGSTb4b4b4,
Te6edf3UriTb4b4b4.Te6edf3parseTb4b4b4(Ta5d6ff"Ta5d6ffpackage:Ta5d6ff" Tff7b72+ Te6edf3getPackageNameTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4)
Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72private Tffa657void Td2a8ffdownloadFirmwareTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3ProductCatalogTb4b4b4.Te6edf3Product Te6edf3product Tff7b72= Te6edf3selectedProductTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3ProductCatalogTb4b4b4.Te6edf3Model Te6edf3model Tff7b72= Te6edf3selectedModelTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3product Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3ToastTb4b4b4.Te6edf3makeTextTb4b4b4(Tff7b72thisTb4b4b4, Ta5d6ff"Ta5d6ffSelect a productTa5d6ff"Tb4b4b4, Te6edf3ToastTb4b4b4.Te6edf3LENGTH_SHORTTb4b4b4)Tb4b4b4.Te6edf3showTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Te6edf3String Te6edf3filename Tff7b72= Te6edf3productTb4b4b4.Te6edf3resolveFirmwareFilenameTb4b4b4(Te6edf3modelTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3filename Tff7b72=Tff7b72= Tff7b72null Tff7b72|Tff7b72| Te6edf3filenameTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3ToastTb4b4b4.Te6edf3makeTextTb4b4b4(Tff7b72thisTb4b4b4, Ta5d6ff"Ta5d6ffNo firmware filename for productTa5d6ff"Tb4b4b4, Te6edf3ToastTb4b4b4.Te6edf3LENGTH_SHORTTb4b4b4)Tb4b4b4.Te6edf3showTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Te6edf3setBusyTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Te6edf3setStatusTb4b4b4(Ta5d6ff"Ta5d6ffDownloading Ta5d6ff" Tff7b72+ Te6edf3filename Tff7b72+ Ta5d6ff"Ta5d6ff…Ta5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3appendLogTb4b4b4(Ta5d6ff"Ta5d6ffDownloading Ta5d6ff" Tff7b72+ Te6edf3filenameTb4b4b4)Tb4b4b4;
Te6edf3ioTb4b4b4.Te6edf3executeTb4b4b4(Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72try Tb4b4b4{
Tffa657byteTff7b72[Tff7b72] Te6edf3bytes Tff7b72= Te6edf3fetchFirmwareZipTb4b4b4(Te6edf3filenameTb4b4b4)Tb4b4b4;
Te6edf3File Te6edf3cache Tff7b72= Tff7b72new Te6edf3FileTb4b4b4(Te6edf3getCacheDirTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3filenameTb4b4b4)Tb4b4b4;
Tff7b72try Tb4b4b4(Te6edf3FileOutputStream Te6edf3fos Tff7b72= Tff7b72new Te6edf3FileOutputStreamTb4b4b4(Te6edf3cacheTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3fosTb4b4b4.Te6edf3writeTb4b4b4(Te6edf3bytesTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3firmwareBytes Tff7b72= Te6edf3bytesTb4b4b4;
Te6edf3firmwareName Tff7b72= Te6edf3filenameTb4b4b4;
Te6edf3mainHandlerTb4b4b4.Te6edf3postTb4b4b4(Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tb4b4b4{
Te6edf3setBusyTb4b4b4(Tff7b72falseTb4b4b4)Tb4b4b4;
Te6edf3setStatusTb4b4b4(Ta5d6ff"Ta5d6ffDownloaded Ta5d6ff" Tff7b72+ Te6edf3filename Tff7b72+ Ta5d6ff"Ta5d6ff (Ta5d6ff" Tff7b72+ Te6edf3bytesTb4b4b4.Te6edf3length Tff7b72+ Ta5d6ff"Ta5d6ff bytes)Ta5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3appendLogTb4b4b4(Ta5d6ff"Ta5d6ffFirmware ready: Ta5d6ff" Tff7b72+ Te6edf3cacheTb4b4b4.Te6edf3getAbsolutePathTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3Exception Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3mainHandlerTb4b4b4.Te6edf3postTb4b4b4(Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tb4b4b4{
Te6edf3setBusyTb4b4b4(Tff7b72falseTb4b4b4)Tb4b4b4;
Te6edf3setStatusTb4b4b4(Ta5d6ff"Ta5d6ffDownload failedTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3appendLogTb4b4b4(Ta5d6ff"Ta5d6ffDownload error: Ta5d6ff" Tff7b72+ Te6edf3eTb4b4b4.Te6edf3getMessageTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3ToastTb4b4b4.Te6edf3makeTextTb4b4b4(Tff7b72thisTb4b4b4, Te6edf3eTb4b4b4.Te6edf3getMessageTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3ToastTb4b4b4.Te6edf3LENGTH_LONGTb4b4b4)Tb4b4b4.Te6edf3showTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72private Tffa657void Td2a8ffflashSelectedTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3UsbSerialHubTb4b4b4.Te6edf3PortInfo Te6edf3port Tff7b72= Te6edf3selectedPortTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3ProductCatalogTb4b4b4.Te6edf3Product Te6edf3product Tff7b72= Te6edf3selectedProductTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3ProductCatalogTb4b4b4.Te6edf3Model Te6edf3model Tff7b72= Te6edf3selectedModelTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3port Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3ToastTb4b4b4.Te6edf3makeTextTb4b4b4(Tff7b72thisTb4b4b4, Te6edf3getStringTb4b4b4(Te6edf3RTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3rnode_flasher_no_usbTb4b4b4)Tb4b4b4, Te6edf3ToastTb4b4b4.Te6edf3LENGTH_SHORTTb4b4b4)Tb4b4b4.Te6edf3showTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3product Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3ToastTb4b4b4.Te6edf3makeTextTb4b4b4(Tff7b72thisTb4b4b4, Ta5d6ff"Ta5d6ffSelect a productTa5d6ff"Tb4b4b4, Te6edf3ToastTb4b4b4.Te6edf3LENGTH_SHORTTb4b4b4)Tb4b4b4.Te6edf3showTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Te6edf3MapTff7b72<Te6edf3StringTb4b4b4, Te6edf3StringTff7b72> Te6edf3flashFiles Tff7b72= Te6edf3productTb4b4b4.Te6edf3resolveFlashFilesTb4b4b4(Te6edf3modelTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3flashFiles Tff7b72=Tff7b72= Tff7b72null Tff7b72|Tff7b72| Te6edf3flashFilesTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3ToastTb4b4b4.Te6edf3makeTextTb4b4b4(Tff7b72thisTb4b4b4, Ta5d6ff"Ta5d6ffNo ESP flash map for this product (nRF52 not in MVP)Ta5d6ff"Tb4b4b4, Te6edf3ToastTb4b4b4.Te6edf3LENGTH_LONGTb4b4b4)
Tb4b4b4.Te6edf3showTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3firmwareBytes Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3ToastTb4b4b4.Te6edf3makeTextTb4b4b4(Tff7b72thisTb4b4b4, Ta5d6ff"Ta5d6ffDownload firmware firstTa5d6ff"Tb4b4b4, Te6edf3ToastTb4b4b4.Te6edf3LENGTH_SHORTTb4b4b4)Tb4b4b4.Te6edf3showTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Te6edf3setBusyTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Te6edf3setStatusTb4b4b4(Te6edf3getStringTb4b4b4(Te6edf3RTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3rnode_flasher_busyTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72final Tffa657byteTff7b72[Tff7b72] Te6edf3zip Tff7b72= Te6edf3firmwareBytesTb4b4b4;
Tff7b72final Te6edf3String Te6edf3deviceId Tff7b72= Te6edf3portTb4b4b4.Te6edf3deviceIdTb4b4b4;
Te6edf3ioTb4b4b4.Te6edf3executeTb4b4b4(Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3ListTff7b72<Te6edf3Esp32SerialFlasherTb4b4b4.Te6edf3ImageTff7b72> Te6edf3images Tff7b72=
Te6edf3Esp32SerialFlasherTb4b4b4.Te6edf3imagesFromZipTb4b4b4(Te6edf3zipTb4b4b4, Te6edf3flashFilesTb4b4b4)Tb4b4b4;
Te6edf3usbHubTb4b4b4.Te6edf3openTb4b4b4(Te6edf3deviceIdTb4b4b4, T79c0ff115200Tb4b4b4)Tb4b4b4;
Te6edf3Esp32SerialFlasher Te6edf3flasher Tff7b72=
Tff7b72new Te6edf3Esp32SerialFlasherTb4b4b4(
Te6edf3usbHubTb4b4b4,
Tff7b72new Te6edf3Esp32SerialFlasherTb4b4b4.Te6edf3ProgressTb4b4b4(Tb4b4b4) Tb4b4b4{
Tf0883e@Override
Tff7b72public Tffa657void Td2a8ffonStatusTb4b4b4(Te6edf3String Te6edf3messageTb4b4b4) Tb4b4b4{
Te6edf3mainHandlerTb4b4b4.Te6edf3postTb4b4b4(Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tb4b4b4{
Te6edf3setStatusTb4b4b4(Te6edf3messageTb4b4b4)Tb4b4b4;
Te6edf3appendLogTb4b4b4(Te6edf3messageTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tf0883e@Override
Tff7b72public Tffa657void Td2a8ffonProgressTb4b4b4(Tffa657int Te6edf3percentTb4b4b4) Tb4b4b4{
Te6edf3mainHandlerTb4b4b4.Te6edf3postTb4b4b4(Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Te6edf3progressBarTb4b4b4.Te6edf3setProgressTb4b4b4(Te6edf3percentTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4)Tb4b4b4;
Te6edf3flasherTb4b4b4.Te6edf3flashTb4b4b4(Te6edf3imagesTb4b4b4, T79c0ff460800Tb4b4b4)Tb4b4b4;
Te6edf3mainHandlerTb4b4b4.Te6edf3postTb4b4b4(Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tb4b4b4{
Te6edf3setBusyTb4b4b4(Tff7b72falseTb4b4b4)Tb4b4b4;
Te6edf3setStatusTb4b4b4(Ta5d6ff"Ta5d6ffFlash completeTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3ToastTb4b4b4.Te6edf3makeTextTb4b4b4(Tff7b72thisTb4b4b4, Ta5d6ff"Ta5d6ffFlash completeTa5d6ff"Tb4b4b4, Te6edf3ToastTb4b4b4.Te6edf3LENGTH_LONGTb4b4b4)Tb4b4b4.Te6edf3showTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3Exception Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3mainHandlerTb4b4b4.Te6edf3postTb4b4b4(Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tb4b4b4{
Te6edf3setBusyTb4b4b4(Tff7b72falseTb4b4b4)Tb4b4b4;
Te6edf3setStatusTb4b4b4(Ta5d6ff"Ta5d6ffFlash failedTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3appendLogTb4b4b4(Ta5d6ff"Ta5d6ffFlash error: Ta5d6ff" Tff7b72+ Te6edf3eTb4b4b4.Te6edf3getMessageTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3ToastTb4b4b4.Te6edf3makeTextTb4b4b4(Tff7b72thisTb4b4b4, Te6edf3eTb4b4b4.Te6edf3getMessageTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3ToastTb4b4b4.Te6edf3LENGTH_LONGTb4b4b4)Tb4b4b4.Te6edf3showTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72finally Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3usbHub Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3usbHubTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72private Tffa657byteTff7b72[Tff7b72] Td2a8fffetchFirmwareZipTb4b4b4(Te6edf3String Te6edf3filenameTb4b4b4) Tff7b72throws Te6edf3Exception Tb4b4b4{
Te6edf3OkHttpClient Te6edf3client Tff7b72= Te6edf3LocalhostTrustOkHttpClientTb4b4b4.Te6edf3getTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// Resolve latest release asset URL via local API, then download through proxy.
Te6edf3String Te6edf3releaseUrl Tff7b72= Te6edf3LOCAL_API Tff7b72+ Ta5d6ff"Ta5d6ff/api/v1/tools/rnode/latest_releaseTa5d6ff"Tb4b4b4;
Te6edf3Request Te6edf3releaseReq Tff7b72= Te6edf3authorizedGetTb4b4b4(Te6edf3releaseUrlTb4b4b4)Tb4b4b4;
Te6edf3String Te6edf3assetUrlTb4b4b4;
Tff7b72try Tb4b4b4(Te6edf3Response Te6edf3response Tff7b72= Te6edf3clientTb4b4b4.Te6edf3newCallTb4b4b4(Te6edf3releaseReqTb4b4b4)Tb4b4b4.Te6edf3executeTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3responseTb4b4b4.Te6edf3isSuccessfulTb4b4b4(Tb4b4b4) Tff7b72|Tff7b72| Te6edf3responseTb4b4b4.Te6edf3bodyTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72throw Tff7b72new Te6edf3IllegalStateExceptionTb4b4b4(Ta5d6ff"Ta5d6fflatest_release HTTP Ta5d6ff" Tff7b72+ Te6edf3responseTb4b4b4.Te6edf3codeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3JSONObject Te6edf3release Tff7b72= Tff7b72new Te6edf3JSONObjectTb4b4b4(Te6edf3responseTb4b4b4.Te6edf3bodyTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3stringTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3JSONArray Te6edf3assets Tff7b72= Te6edf3releaseTb4b4b4.Te6edf3optJSONArrayTb4b4b4(Ta5d6ff"Ta5d6ffassetsTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3assetUrl Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3assets Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72for Tb4b4b4(Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3assetsTb4b4b4.Te6edf3lengthTb4b4b4(Tb4b4b4)Tb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Te6edf3JSONObject Te6edf3asset Tff7b72= Te6edf3assetsTb4b4b4.Te6edf3getJSONObjectTb4b4b4(Te6edf3iTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3filenameTb4b4b4.Te6edf3equalsTb4b4b4(Te6edf3assetTb4b4b4.Te6edf3optStringTb4b4b4(Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3assetUrl Tff7b72= Te6edf3assetTb4b4b4.Te6edf3optStringTb4b4b4(Ta5d6ff"Ta5d6ffbrowser_download_urlTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3assetUrl Tff7b72=Tff7b72= Tff7b72null Tff7b72|Tff7b72| Te6edf3assetUrlTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3assetUrl Tff7b72=
Ta5d6ff"Ta5d6ffhttps://github.com/markqvist/RNode_Firmware/releases/latest/download/Ta5d6ff"
Tff7b72+ Te6edf3filenameTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Te6edf3String Te6edf3downloadUrl Tff7b72=
Te6edf3LOCAL_API
Tff7b72+ Ta5d6ff"Ta5d6ff/api/v1/tools/rnode/download_firmware?url=Ta5d6ff"
Tff7b72+ Te6edf3UriTb4b4b4.Te6edf3encodeTb4b4b4(Te6edf3assetUrlTb4b4b4)Tb4b4b4;
Te6edf3Request Te6edf3dlReq Tff7b72= Te6edf3authorizedGetTb4b4b4(Te6edf3downloadUrlTb4b4b4)Tb4b4b4;
Tff7b72try Tb4b4b4(Te6edf3Response Te6edf3response Tff7b72= Te6edf3clientTb4b4b4.Te6edf3newCallTb4b4b4(Te6edf3dlReqTb4b4b4)Tb4b4b4.Te6edf3executeTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3responseTb4b4b4.Te6edf3isSuccessfulTb4b4b4(Tb4b4b4) Tff7b72|Tff7b72| Te6edf3responseTb4b4b4.Te6edf3bodyTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72throw Tff7b72new Te6edf3IllegalStateExceptionTb4b4b4(Ta5d6ff"Ta5d6ffdownload_firmware HTTP Ta5d6ff" Tff7b72+ Te6edf3responseTb4b4b4.Te6edf3codeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3ResponseBody Te6edf3body Tff7b72= Te6edf3responseTb4b4b4.Te6edf3bodyTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3bodyTb4b4b4.Te6edf3bytesTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72private Te6edf3Request Td2a8ffauthorizedGetTb4b4b4(Te6edf3String Te6edf3urlTb4b4b4) Tb4b4b4{
Te6edf3RequestTb4b4b4.Te6edf3Builder Te6edf3builder Tff7b72= Tff7b72new Te6edf3RequestTb4b4b4.Te6edf3BuilderTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3urlTb4b4b4(Te6edf3urlTb4b4b4)Tb4b4b4.Te6edf3getTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3String Te6edf3cookie Tff7b72= Te6edf3CookieManagerTb4b4b4.Te6edf3getInstanceTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3getCookieTb4b4b4(Te6edf3LOCAL_APITb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3cookie Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Tff7b72!Te6edf3cookieTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3builderTb4b4b4.Te6edf3headerTb4b4b4(Ta5d6ff"Ta5d6ffCookieTa5d6ff"Tb4b4b4, Te6edf3cookieTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3builderTb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tf0883e@Nullable
Tff7b72private Te6edf3UsbSerialHubTb4b4b4.Te6edf3PortInfo Td2a8ffselectedPortTb4b4b4(Tb4b4b4) Tb4b4b4{
Tffa657int Te6edf3idx Tff7b72= Te6edf3usbSpinnerTb4b4b4.Te6edf3getSelectedItemPositionTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3idx Tff7b72< T79c0ff0 Tff7b72|Tff7b72| Te6edf3idx Tff7b72>Tff7b72= Te6edf3portsTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3portsTb4b4b4.Te6edf3getTb4b4b4(Te6edf3idxTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tf0883e@Nullable
Tff7b72private Te6edf3ProductCatalogTb4b4b4.Te6edf3Product Td2a8ffselectedProductTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3Object Te6edf3item Tff7b72= Te6edf3productSpinnerTb4b4b4.Te6edf3getSelectedItemTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3item Tff7b72instanceof Te6edf3ProductCatalogTb4b4b4.Te6edf3Product Tff7b72? Tb4b4b4(Te6edf3ProductCatalogTb4b4b4.Te6edf3ProductTb4b4b4) Te6edf3item Tb4b4b4: Tff7b72nullTb4b4b4;
Tb4b4b4}
Tf0883e@Nullable
Tff7b72private Te6edf3ProductCatalogTb4b4b4.Te6edf3Model Td2a8ffselectedModelTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3Object Te6edf3item Tff7b72= Te6edf3modelSpinnerTb4b4b4.Te6edf3getSelectedItemTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3item Tff7b72instanceof Te6edf3ProductCatalogTb4b4b4.Te6edf3Model Tff7b72? Tb4b4b4(Te6edf3ProductCatalogTb4b4b4.Te6edf3ModelTb4b4b4) Te6edf3item Tb4b4b4: Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72private Tffa657void Td2a8ffsetBusyTb4b4b4(Tffa657boolean Te6edf3busyTb4b4b4) Tb4b4b4{
Te6edf3flashButtonTb4b4b4.Te6edf3setEnabledTb4b4b4(Tff7b72!Te6edf3busyTb4b4b4)Tb4b4b4;
Te6edf3downloadButtonTb4b4b4.Te6edf3setEnabledTb4b4b4(Tff7b72!Te6edf3busyTb4b4b4)Tb4b4b4;
Te6edf3progressBarTb4b4b4.Te6edf3setIndeterminateTb4b4b4(Te6edf3busy Tff7b72&Tff7b72& Te6edf3progressBarTb4b4b4.Te6edf3getProgressTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= T79c0ff0Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72private Tffa657void Td2a8ffsetStatusTb4b4b4(Te6edf3String Te6edf3textTb4b4b4) Tb4b4b4{
Te6edf3statusViewTb4b4b4.Te6edf3setTextTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72private Tffa657void Td2a8ffappendLogTb4b4b4(Te6edf3String Te6edf3lineTb4b4b4) Tb4b4b4{
Te6edf3CharSequence Te6edf3existing Tff7b72= Te6edf3logViewTb4b4b4.Te6edf3getTextTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3existing Tff7b72=Tff7b72= Tff7b72null Tff7b72|Tff7b72| Te6edf3existingTb4b4b4.Te6edf3lengthTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3logViewTb4b4b4.Te6edf3setTextTb4b4b4(Te6edf3lineTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3logViewTb4b4b4.Te6edf3setTextTb4b4b4(Te6edf3existing Tff7b72+ Ta5d6ff"Ta5d6ff\Ta5d6ffnTa5d6ff" Tff7b72+ Te6edf3lineTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────